﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace AuktionsServer
{
    class Server
    {
		private Auktion kørendeAuktion;
		private Services services;
        private static List<Klient> klienter;
        private int port;

        /// <summary>
        /// Vi bruger serverens konstruktor for aggregering af services og klienthandler klasser. Vi opretter en liste af klienter.
        /// Klient listen er static. På denne måde kan tilføjes alle klienter på den samme liste. 
        /// Konstruktoren indholder funktioner til at oprette forbindelse mellem klient og server. 
        /// I løsningen bruger vi Tcplistener og IP loopback adressen.
        /// Her starter vi vores klient-tråd. Det bruges til at handle flere klienter samtidigt.
        /// </summary>
		public Server() //Konstruktor
		{
            Console.WriteLine("Serveren er startet.");
			services = new Services();
            klienter = new List<Klient>();
			kørendeAuktion = services.StartAuktion();
			
            IPAddress ip = IPAddress.Parse("127.0.0.1"); // IP loopback adresse
            port = 11000;
            TcpListener listener = new TcpListener(ip, port);
            listener.Start();
            Console.WriteLine("Serveren er klar.");
            
            while (true) // - de funktioner kører indtil programmet ikke stoppes
            {
                Socket clientSocket = listener.AcceptSocket();

                KlientHandler handler = new KlientHandler(clientSocket, services); //aggregering af klientHandler

                Thread klientTråd = new Thread(handler.KoerKlient); // klient tråd sørger for forbindelse til flere klienter samtidigt.
                klientTråd.Start();    //starter klient tråden     
            }
		}

		public Auktion auktion
		{
			get { return kørendeAuktion; }
		}

        internal static List<Klient> Klienter
        {
            get { return Server.klienter; }
        }

    }
}
